perm filename MOVE.SAI[AL,HE] blob sn#344882 filedate 1978-03-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "MOVE  - GENERATES SIMPLE TRAJECTORY AND SENDS DATA TO BLUE ARM"
C00004 00003	⊃ PROCEDURE FOR SAVING A INTEGER NUMBER IN THE DATA FILE
C00006 00004	⊃ TRANSFORM DEFINITIONS
C00008 00005	⊃ SET UP THE COEFFICIENT LIST HEADER
C00011 00006	⊃ WRITE OUT THE SEGMENT HEADER IF NOT FIRST POSITION
C00013 ENDMK
C⊗;
BEGIN "MOVE  - GENERATES SIMPLE TRAJECTORY AND SENDS DATA TO BLUE ARM"

DEFINE ⊃="COMMENT",CR="'15",LF="'12",CRLF="('15&'12)",FF="'14";

STRING NEWNME;
REAL ARRAY NEWJ[1:6];
REAL TT,DIF;
BOOLEAN FIRST,LAST;
INTEGER TIME,JOINT,MASTER;
INTEGER SEGS,TNUM,TRANS;
INTEGER JTS,I,J,K,ERROR;
INTEGER ARRAY JT[1:10];
INTEGER DUM,MECH;
STRING LST,ONE,COMMA,HEAD,DLST;
INTEGER SEGPTR,BITS,PTR;
INTEGER ARRAY DATA[1:2000];
REAL ARRAY TTRANS[1:4,1:4];
REAL ARRAY DD[1:20],OLD[1:10];
REAL T,P,FACT,TS;

EXTERNAL PROCEDURE DTERMS(REAL ARRAY DD;REFERENCE REAL TH;INTEGER ARM);
EXTERNAL PROCEDURE TLKEF3(INTEGER MASTER;INTEGER ARRAY DATA);
EXTERNAL INTEGER PROCEDURE TLKEF5(REAL ARRAY TRANS,ANGLES);

REQUIRE "BEJCZY[AL,HE]" LOAD_MODULE;
REQUIRE "FAITRG.FAI[AL,HE]" LOAD_MODULE;
REQUIRE "TLKEF3.FAI[AL,HE]" LOAD_MODULE;
REQUIRE "TLKEF5.FAI[AL,HE]" LOAD_MODULE;
⊃ PROCEDURE FOR SAVING A INTEGER NUMBER IN THE DATA FILE;

SIMPLE PROCEDURE INTOUT(INTEGER NUM);
	BEGIN
	DATA[PTR]←NUM;
	PTR←PTR+1;
	END;




⊃ PROCEDURE FOR SAVING A FLOATING POINT NUMBER IN 11 FORMAT IN THE DATA ARRAY;

SIMPLE PROCEDURE FLTOUT(REAL FNUM);
	BEGIN
	LABEL ST1,ST2,OVER,FLTEND;
	INTEGER BYTE,NUM1,NUM2;
	BYTE←'013200000002;
		START_CODE
		   	MOVE   2,FNUM;
			JUMPGE 2,ST1;
			MOVN   2,2;
 			TLO    2,'400000;
		ST1:	JFCL   2,ST2;
		ST2:	ADDI   2,4;
			JFCL   2,OVER;
     		    	DPB    2,BYTE;
			SETZ   1,;
			LSHC   1,16;
			MOVEM  1,NUM1;
			SETZ   1,;
			LSHC   1,16;
			MOVEM  1,NUM2;
		END;
	DATA[PTR]←NUM1;
	PTR←PTR+1;
	DATA[PTR]←NUM2;
	PTR←PTR+1;
	GOTO FLTEND;
OVER:	OUTSTR("ERROR-ROUNDING OVERFLOW"&CRLF);
FLTEND:	END; 
⊃ TRANSFORM DEFINITIONS;

STRING ARRAY TNAME[1:20];
REAL ARRAY ANG[1:20,1:6];

PROCEDURE TRAN(STRING NME;REAL J1,J2,J3,J4,J5,J6);
	BEGIN
	TRANS←TRANS+1;
 	TNAME[TRANS]←NME;
	ANG[TRANS,1]←J1;       ANG[TRANS,2]←J2;
	ANG[TRANS,3]←J3;   	ANG[TRANS,4]←J4;
    	ANG[TRANS,5]←J5;       ANG[TRANS,6]←J6;
	END;

	
TRANS←0;

TRAN ("PARK"    , 180.0 , -90.0 , 14.00 , -90.0 ,  90.0 ,   0.0 );
TRAN ("DPARK"   , 180.0 , -79.4 , 14.36 , -90.0 , 100.0 ,   0.0 );
TRAN ("P1"      ,  31.1 ,-114.2 , 20.65 , -90.0 ,  67.4 ,   0.0 );
TRAN ("DP1"     ,  31.1 , -99.8 , 18.69 , -90.0 ,  79.3 ,   0.0 );
TRAN ("P2"      ,  90.0 , -90.0 , 18.00 , -90.0 ,  90.0 , -90.0 );
TRAN ("P3"      ,  30.0 , -70.0 , 15.00 ,  90.0 ,   0.0 ,  90.0 );


⊃ DEFINE THE WORKING JOINTS;

	JTS←6;
	JT[1]←1;
	JT[2]←2;
	JT[3]←3;
	JT[4]←4;
	JT[5]←5;
	JT[6]←6;
	BITS←'770;
	SEGPTR←8+JTS*32;
	MECH←'4;
⊃ SET UP THE COEFFICIENT LIST HEADER;

	MASTER←'67676;
	SETFORMAT(10,3);
	OUTSTR(CRLF&CRLF&"MOVE TEST PROGRAM...."&CRLF&CRLF);
	DO BEGIN "MAINLP"
	PTR←1;
	INTOUT(BITS);
	INTOUT(0);
	INTOUT(0);
	INTOUT(0);	⊃ WOBBLE;
	FIRST←TRUE;
	LAST←FALSE;
	DO BEGIN "READMVE"
		TNUM←0;

⊃ READ IN THE TRANSFORM NAME;

		DO BEGIN "READTRN"
			IF FIRST THEN 
			    OUTSTR("TYPE IN THE START TRANSFORM NAME = ")
			ELSE OUTSTR("TYPE IN THE NEXT TRANSFORM NAME = ");
			LST←INCHWL;
			IF EQU("?",LST) THEN BEGIN
			    OUTSTR("THE EXISTING TRANSFORMS ARE CALLED:"&CRLF);
			    FOR J←1 STEP 1 UNTIL TRANS DO
				OUTSTR("   "&TNAME[J]&CRLF);
			    END
			ELSE IF EQU("DEFINE",LST) THEN BEGIN
			    OUTSTR("NEW TRANFORM NAME = ");
			    NEWNME←INCHWL;
			    OUTSTR("TYPE IN THE 6 JOINT ANGLES:"&CRLF);
			    LST←INCHWL;
			    FOR J←1 STEP 1 UNTIL 6 DO 
				NEWJ[J]←REALSCAN(LST,DUM);
			    TRAN(NEWNME,NEWJ[1],NEWJ[2],NEWJ[3],NEWJ[4],
				NEWJ[5],NEWJ[6]);
			    END
			ELSE IF EQU("PRINT",LST) THEN BEGIN
			    OUTSTR("TRANSFORM NAME = ");
			    LST←INCHWL;
			    K←0;
			    FOR J←1 STEP 1 UNTIL TRANS DO 
				IF EQU(LST,TNAME[J]) THEN K←J;
			    IF K=0 THEN OUTSTR("CAN'T FIND TRANSFORM"&CRLF)
			    ELSE BEGIN
				FOR J←1 STEP 1 UNTIL 6 DO OUTSTR(CVF(ANG[K,J]));
				OUTSTR(CRLF);
				END;
			    END
			ELSE IF EQU("HERE",LST) THEN BEGIN
			    OUTSTR("TRANSFORM NAME = ");
			    NEWNME ← INCHWL;
			    ERROR ← TLKEF5(TTRANS,NEWJ);
			    IF ERROR=0 THEN TRAN(NEWNME,NEWJ[1],NEWJ[2],
				NEWJ[3],NEWJ[4],NEWJ[5],NEWJ[6])
			    ELSE OUTSTR("CAN'T DEFINE TRANSFORM"&CRLF);
			    END
			ELSE BEGIN
			    FOR J←1 STEP 1 UNTIL TRANS DO 
				IF EQU(LST,TNAME[J]) THEN TNUM←J;
			    IF TNUM=0 THEN
				OUTSTR("...INVALID TRANS NAME..."&CRLF);
			END;
		END "READTRN" UNTIL TNUM≠0;
⊃ WRITE OUT THE SEGMENT HEADER IF NOT FIRST POSITION;

		IF ¬FIRST THEN BEGIN "SETSEG"
			OUTSTR("SEGMENT TIME IN SECONDS = ");
			LST←INCHWL;
			TT←REALSCAN(LST,DUM)*1000.0;
			TIME←TT;
			INTOUT(SEGPTR);
			INTOUT(TIME);
			INTOUT(0); INTOUT(0);

⊃ WRITE OUT THE POLYNOMIAL AND DYNAMIC COEFFICIENTS;

			FOR J←1 STEP 1 UNTIL JTS DO BEGIN
				JOINT←JT[J];
				DIF←ANG[TNUM,JOINT]-OLD[JOINT];
				FLTOUT(OLD[JOINT]);
				FLTOUT(0.0);  FLTOUT(0.0);
				FLTOUT(10.0*DIF);
				FLTOUT(-15.0*DIF);
				FLTOUT(6.0*DIF);
			END;
			DTERMS(DD,ANG[TNUM,1],MECH);
			FOR J←1 STEP 1 UNTIL JTS DO BEGIN
				K←(JT[J]-1)*2+1;
				FLTOUT(DD[K]);
				FLTOUT(DD[K+1]);
			END;
			OUTSTR("IS THIS THE FINAL SEGMENT (Y,N)? ");
			LST←INCHWL;
			IF EQU(LST,"Y") THEN BEGIN
				INTOUT(0);
				LAST←TRUE;
				END;
		END "SETSEG";
		FOR J←1 STEP 1 UNTIL 6 DO OLD[J]←ANG[TNUM,J];
		FIRST←FALSE;
	END "READMVE" UNTIL LAST;
	OUTSTR("EXECUTE THIS MOTION (Y,N)? ");
	LST←INCHWL;
	IF EQU("Y",LST) THEN DO BEGIN
		TLKEF3(MASTER,DATA);
		OUTSTR("REPEAT MOTION (Y,N) ? ");
		LST←INCHWL;
		END UNTIL ¬EQU("Y",LST);
	OUTSTR("DO ANOTHER MOTION (Y,N)? " );
	LST←INCHWL;
	END "MAINLP" UNTIL ¬EQU(LST,"Y");
    	OUTSTR("I HOPE YOU HAD A GOOD TIME..."&CRLF);

END